<?php

// TTTTTTTTTTTTTTTTTTTTTTT                  MMMMMMMM               MMMMMMMM                                CCCCCCCCCCCCMMMMMMMM               MMMMMMMM  SSSSSSSSSSSSSSS 
// T:::::::::::::::::::::T                  M:::::::M             M:::::::M                             CCC::::::::::::M:::::::M             M:::::::MSS:::::::::::::::S
// T:::::::::::::::::::::T                  M::::::::M           M::::::::M                           CC:::::::::::::::M::::::::M           M::::::::S:::::SSSSSS::::::S
// T:::::TT:::::::TT:::::T                  M:::::::::M         M:::::::::M                          C:::::CCCCCCCC::::M:::::::::M         M:::::::::S:::::S     SSSSSSS
// TTTTTT  T:::::T  TTTTTppppp   ppppppppp  M::::::::::M       M::::::::::M   eeeeeeeeeeee          C:::::C       CCCCCM::::::::::M       M::::::::::S:::::S            
//         T:::::T       p::::ppp:::::::::p M:::::::::::M     M:::::::::::M ee::::::::::::ee       C:::::C             M:::::::::::M     M:::::::::::S:::::S            
//         T:::::T       p:::::::::::::::::pM:::::::M::::M   M::::M:::::::Me::::::eeeee:::::ee     C:::::C             M:::::::M::::M   M::::M:::::::MS::::SSSS         
//         T:::::T       pp::::::ppppp::::::M::::::M M::::M M::::M M::::::e::::::e     e:::::e     C:::::C             M::::::M M::::M M::::M M::::::M SS::::::SSSSS    
//         T:::::T        p:::::p     p:::::M::::::M  M::::M::::M  M::::::e:::::::eeeee::::::e     C:::::C             M::::::M  M::::M::::M  M::::::M   SSS::::::::SS  
//         T:::::T        p:::::p     p:::::M::::::M   M:::::::M   M::::::e:::::::::::::::::e      C:::::C             M::::::M   M:::::::M   M::::::M      SSSSSS::::S 
//         T:::::T        p:::::p     p:::::M::::::M    M:::::M    M::::::e::::::eeeeeeeeeee       C:::::C             M::::::M    M:::::M    M::::::M           S:::::S
//         T:::::T        p:::::p    p::::::M::::::M     MMMMM     M::::::e:::::::e                 C:::::C       CCCCCM::::::M     MMMMM     M::::::M           S:::::S
//       TT:::::::TT      p:::::ppppp:::::::M::::::M               M::::::e::::::::e                 C:::::CCCCCCCC::::M::::::M               M::::::SSSSSSS     S:::::S
//       T:::::::::T      p::::::::::::::::pM::::::M               M::::::Me::::::::eeeeeeee          CC:::::::::::::::M::::::M               M::::::S::::::SSSSSS:::::S
//       T:::::::::T      p::::::::::::::pp M::::::M               M::::::M ee:::::::::::::e            CCC::::::::::::M::::::M               M::::::S:::::::::::::::SS 
//       TTTTTTTTTTT      p::::::pppppppp   MMMMMMMM               MMMMMMMM   eeeeeeeeeeeeee               CCCCCCCCCCCCMMMMMMMM               MMMMMMMMSSSSSSSSSSSSSSS   
//                        p:::::p                                                                                                                                       
//                        p:::::p                                                                                                                                       
//                       p:::::::p                                                                                                                                      
//                       p:::::::p                                                                                                                                      
//                       p:::::::p                                                                                                                                      
//                       ppppppppp                                                                                                                                      

//  _____      __  __         ____ __  __ ____  
// |_   __ __ |  \/  | ___   / ___|  \/  / ___|     | AUTHOR: Xiaohe
//   | || '_ \| |\/| |/ _ \ | |   | |\/| \___ \     | EMAIL: 496631085@qq.com
//   | || |_) | |  | |  __/ | |___| |  | |___) |    | WECHAT: he4966
//   |_|| .__/|_|  |_|\___|  \____|_|  |_|____/     | DATETIME: 2021/07/3
//      |_|                                         | TpMeCMS

declare(strict_types=1);

namespace ImiApp\ApiServer\Api\Controller;

use ImiApp\ApiServer\Api\Controller\Tpmecms;
use Imi\Db\Db;
use Imi\Server\Http\Route\Annotation\Action;
use Imi\Server\Http\Route\Annotation\Controller;
use Imi\Server\Http\Route\Annotation\Route;
use Psr\Http\Message\ResponseInterface;
use Imi\Aop\Annotation\Inject;
// use Phpben\Imi\Validate\Annotation\Validate;
use Phpben\Imi\Auth\Annotation\Auth;

// use Exception;
// use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
// use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
// use think\exception\PDOException;
// use think\exception\ValidateException;

/**
 * 地址
 * @Auth(name="token",nologin={"get_area", "update_map"})
 * @Controller("/addr/")
 */
class Addr extends Tpmecms
{

    // 无需登录的接口,*表示全部
    protected $noNeedLogin = ['get_area', 'update_map'];
    // 无需鉴权的接口,*表示全部
    protected $noNeedRight = ['*'];




    /**
     * 获取地区id
     *
     * @param string $province 省
     * @param string $city 市
     * @param string $district 区
     * @param string $town 乡镇
     * @return void
     */
    public function GetAreaId($province = null, $city = null, $district = null, $town = null)
    {


        $db = 'area';
        if (!$province) {
            return false;
        }

        if ($city) {
            // halt($this->get_province_id($province));
            // $province_id = $this->GetProvince_id($province);
            // return $this->success($province,$list);
            $city_id = $this->GetCity_id($city);
            if ($city_id) {
                if ($district) {


                    if ($town) {
                        $district_id = Db::name($db)
                            ->where('pid', '=', $city_id)
                            ->where('name', '=', $district)
                            ->value('id');

                        if (!$district_id) {
                            $data['pid'] = $city_id;
                            $data['shortname'] = rtrim($district, '区');
                            $data['name'] = $district;
                            $data['mergename'] = '中国,' . $province . ',' . $city . ',' . $district;
                            $data['level'] = 3;


                            // `pid` int(10) DEFAULT NULL COMMENT '父id',
                            // `shortname` varchar(100) DEFAULT NULL COMMENT '简称',
                            // `name` varchar(100) DEFAULT NULL COMMENT '名称',
                            // `mergename` varchar(255) DEFAULT NULL COMMENT '全称',
                            // `level` tinyint(4) DEFAULT NULL COMMENT '层级 0 1 2 省市区县',
                            // `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音',
                            // `code` varchar(100) DEFAULT NULL COMMENT '长途区号',
                            // `zip` varchar(100) DEFAULT NULL COMMENT '邮编',
                            // `first` varchar(50) DEFAULT NULL COMMENT '首字母',
                            //存储这个区域
                            $district_id = Db::name($db)->insert($data)->getLastInsertId();
                        }


                        $id = Db::name($db)
                            ->where('pid', '=', $district_id)
                            ->where('name', '=', $town)
                            ->value('id');

                        if (!$id) {
                            $data['pid'] = $district_id;
                            $data['shortname'] = rtrim($town);
                            $data['name'] = $town;
                            $data['mergename'] = '中国,' . $province . ',' . $city . ',' . $district . ',' . $town;
                            $data['level'] = 4;


                            // `pid` int(10) DEFAULT NULL COMMENT '父id',
                            // `shortname` varchar(100) DEFAULT NULL COMMENT '简称',
                            // `name` varchar(100) DEFAULT NULL COMMENT '名称',
                            // `mergename` varchar(255) DEFAULT NULL COMMENT '全称',
                            // `level` tinyint(4) DEFAULT NULL COMMENT '层级 0 1 2 省市区县',
                            // `pinyin` varchar(100) DEFAULT NULL COMMENT '拼音',
                            // `code` varchar(100) DEFAULT NULL COMMENT '长途区号',
                            // `zip` varchar(100) DEFAULT NULL COMMENT '邮编',
                            // `first` varchar(50) DEFAULT NULL COMMENT '首字母',
                            //存储这个区域
                            // $id = Db::name($db)->insert($data)->getLastInsertId();
                            // return $this->error('没有该市区'.$city); 
                        }


                        return $id;
                    } else {

                        // return false;
                    }
                }
            }
        } else {
            //没有市区


            // return $this->error('没有该市区'.$city); 
        }


        return false;
    }



    /**
     * 添加地址🌍
     *
     * @param string $addr 地址
     * @param string $uid 用户
     * @param string $tel 电话
     * @param string $name 姓名
     * @param string $province 省
     * @param string $city 城市
     * @param string $district 区 
     * @param string $town 街道乡镇
     * @param string $lat 纬度
     * @param string $lng 经度
     * @return void
     */
    public function AddAddr($addr, $uid, $status = '1', $tel = null, $name = null, $city = null, $lat = null, $lng = null, $province = null, $district = null, $town = null)
    {
        $data['uid'] = $uid;
        $data['addr'] = $addr;
        $data['tel'] = $tel;
        $data['name'] = $name;
        $data['province'] = $province;
        $data['district'] = $district;
        $data['town'] = $town;
        $data['not_del'] = 1;

        $res = Db::name('addr')->whereEx($data)->select()->get();
        if (!$res) {


            $data['area_id'] = $this->GetAreaId($province, $city, $district, $town);

            $area = $this->GetAreaAllData($data['area_id']);
            $data = array_merge($data,$area);

            $data['lng'] = $lng;
            $data['lat'] = $lat;
            $data['city'] = $city;
            // $data['status'] = $status;
            $data['use_num'] = 1;
            $data['time'] = time();
            $data['id'] = Db::name('addr')->insert($data)->getLastInsertId();
            return $data['id'];
        }

        return $res['id'];
    }



    /**
     * 编辑地址🌍
     *
     * @param int $id id
     * @param string $addr 地址
     * @param string $uid 用户
     * @param string $tel 电话
     * @param string $name 姓名
     * @param string $province 省
     * @param string $city 城市
     * @param string $district 区 
     * @param string $town 街道乡镇
     * @param string $lat 纬度
     * @param string $lng 经度
     * @return void
     */
    public function EditAddr($id, $addr, $uid, $status = '1', $tel = null, $name = null, $city = null, $lat = null, $lng = null, $province = null, $district = null, $town = null)
    {
        // $data['uid'] = $uid;
        $data['addr'] = $addr;
        $data['tel'] = $tel;
        $data['name'] = $name;
        $data['province'] = $province;
        $data['district'] = $district;
        $data['town'] = $town;
        $data['not_del'] = 1;





        $data['area_id'] = $this->GetAreaId($province, $city, $district, $town);

        $area = $this->GetAreaAllData($data['area_id']);
        $data = array_merge($data,$area);

        $data['lng'] = $lng;
        $data['lat'] = $lat;
        $data['city'] = $city;
        // $data['status'] = $status;
        $data['use_num'] = 1;
        $data['time'] = time();
        $res = Db::name('addr')->where('id', '=', $id)->where('uid', '=', $uid)->update($data);
        return $res;
    }

    /**
     * 获取我的地址列表🌍
     *
     * @param string $uid 用户
     * @param string $status2 状态
     * @return array
     */
    public function GetMyAddrList($uid)
    {
        $status2=null;
        // var_dump('GetMyAddrList',$status2);
        // throw new \Exception('异常');
        // return $this->error('$status',$status2);

        $data['uid'] = $uid;
        if ($status2)
            $data['status'] = $status2;
        $data['not_del'] = 1;

        $list = Db::name('addr')
            ->whereEx($data)
            ->orderRaw('use_num desc,time desc')
            // ->orderRaw('time desc')
            ->select()->getArray();

        return $list;
    }



    /**
     * 获取地址城市Ids🌍
     *
     * @param int $city 地址city
     * @return void
     */
    public function GetAddrCityIds($city)
    {
        return Db::name('addr')->where('city', '=', $city)->column('id');
    }

    /**
     * 获取地址省Ids🌍
     *
     * @param int $province 地址province
     * @return void
     */
    public function GetAddrProvinceIds($province)
    {
        return Db::name('addr')->where('province', '=', $province)->column('id');
    }


    /**
     * 获取地址区Ids🌍
     *
     * @param int $district 地址district
     * @return void
     */
    public function GetAddrDistrictIds($district)
    {
        return Db::name('addr')->where('district', '=', $district)->column('id');
    }



    /**
     * 获取省id
     *
     * @param [type] $province
     * @return void
     */
    public function GetProvince_id($province)
    {
        $id =  Db::name('area')
            ->where('pid', '=', 0)
            ->where('level', '=', 1)
            ->where('name', '=', $province)
            ->value('id');
        if (!$id) return false; //return $this->error('没有该省',$province);
        return $id;
    }

    public function GetCity_id($city)
    {
        $id =  Db::name('area')
            // ->where('pid',0)
            ->where('level', '=', 2)
            ->where('name', '=', $city)
            ->value('id');
        if (!$id) return false; //return $this->error('没有该市',$city);
        return $id;
    }

    public function GetDistrict_id($district)
    {
        $id =  Db::name('area')
            // ->where('pid','=',0)
            ->where('level', '=', 3)
            ->where('name', '=', $district)
            ->value('id');
        if (!$id) return false; //return $this->error('没有该区',$district);
        return $id;
    }



    /**
     * 获取地区信息
     *
     * @param string $province 省
     * @param string $city 市
     * @param string $district 区
     * @param string $town 街道或镇
     * @return void
     * @Action
     */
    public function get_area($province = null, $city = null, $district = null, $town = null)
    {
        // $this->GetAreaId($province, $city, $district, $town);
        $db = 'area';
        if (!$province) {

            $list = Db::name($db)
                ->where('pid', '=', 0)
                ->where('level', '=', 1)

                ->select()->getArray();
            return $this->success($province, $list);
        }

        if (!$city) {
            // halt($this->get_province_id($province));
            $list = Db::name($db)
                ->where('pid', '=', $this->get_province_id($province))
                ->where('level', '=', 2)
                // ->where('name',$province)
                ->select()->getArray();
            return $this->success($province, $list);
        }

        if (!$district) {
            $list = Db::name($db)
                ->where('pid', '=', $this->get_city_id($city))
                // ->where('name','=',$city)
                ->select()->getArray();
            return $this->success($city, $list);
        }
        if (!$town) {
            $list = Db::name($db)
                ->where('pid', '=', $this->get_district_id($district))
                // ->where('pid', '=',$this->get_district_id($district))
                ->select()->getArray();
            return $this->success($district, $list);
        } else {
            $data = Db::name($db)
                // ->where('pid','=', $this->get_city_id($city))
                ->where('pid', '=', $this->get_district_id($district))
                ->where('name', '=', $town)
                ->select()->get();
            return $this->success($city, $data);
        }
    }

    /**
     * 获取省id
     *
     * @param string $province 省
     * @return void
     */
    public function get_province_id($province)
    {
        // $province = rtrim($province, '市');
        $id =  Db::name('area')
            ->where('pid', '=', 0)
            ->where('level', '=', 1)
            ->where('name', '=', $province)
            ->value('id');
        if (!$id) return $this->error('没有该省', $province);
        return $id;
    }

    public function get_city_id($city)
    {
        $id =  Db::name('area')
            // ->where('pid','=',0)
            ->where('level', '=', 2)
            ->where('name', '=', $city)
            ->value('id');
        if (!$id) return $this->error('没有该市', $city);
        return $id;
    }

    public function get_district_id($district)
    {
        $id =  Db::name('area')
            // ->where('pid','=',0)
            ->where('level', '=', 3)
            ->where('name', '=', $district)
            ->value('id');
        if (!$id) return $this->error('没有该区', $district);
        return $id;
    }





    /**
     * 添加地址🌍
     *
     * @param string $addr 地址
     * @param string $tel 电话
     * @param string $name 姓名
     * @param string $province 省
     * @param string $city 城市
     * @param string $district 区 
     * @param string $lat 纬度
     * @param string $lng 经度
     * @param string $town 街道乡镇
     * @param string $default 默认地址1
     * @return void
     * @Action
     */
    public function add_addr($addr, $status = '1', $tel = null, $name = null, $city = null, $lat = null, $lng = null, $default = null, $province = null, $district = null, $town = null)
    {
        //     * @param string $status 状态类型1=未知,2=发货地,3=收货地

        $id = $this->AddAddr($addr, $this->auth->user()->id, $status, $tel, $name, $city, $lat, $lng, $province, $district, $town);
        if ($id) {
            if ($default)
                $this->UpdateDefaultAddr($this->auth->user()->id, $id);
            return $this->success('ok', $this->GetAddrData($id));
        }
    }


    /**
     * 获取我的地址列表🌍
     *
     * 
     * @param string $status 状态
     * @return void
     * @Action
     */
    public function get_my_addr_list(?string $status = null)
    {

        $list = $this->GetMyAddrList($this->auth->user()->id);
        // var_dump('list',$list);
        return $this->success('ok', $list);
    }


    /**
     * 获取地址信息🌍
     *
     * @param int $id 地址id
     * @return void
     * @Action
     */
    public function get_addr_data($id)
    {
        return Db::name('addr')->where('id','=',$id)->select()->get();
        $data = $this->GetAddrData($id);
        // $this->AddAddrUseNum($id);
        return $this->success('ok', $data);
    }



    /**
     * 获取默认地址🌍
     *
     * @param int $id 地址id
     * @return void
     * @Action
     */
    public function get_default_addr()
    {
        $data = Db::name('addr')->where('uid','=',$this->auth->user()->id)->where('not_del','=',1)->orderRaw('default_status desc')->find();
        return $this->success('ok', $data);
    }
    


    /**
     * 删除地址信息🌍
     *
     * @param int $id 地址id
     * @return void
     * @Action
     */
    public function del_my_addr($id)
    {
        $res = Db::name('addr')->where('id', '=', $id)->where('uid', '=', $this->auth->user()->id)->update(['not_del' => 0]);
        return $this->success('删除成功', $res);
    }

    // /**
    //  * 编辑地址信息
    //  *
    //  * @param int $id 地址id
    //  * @param int $default 默认传1
    //  * @return void
    //  */
    // public function edit_addr($id, $default = null)
    // {
    //     $data = $this->GetAddrData($id);
    //     if ($data) {
    //         if ($default)
    //             $this->UpdateDefaultAddr($this->auth->user()->id, $id);

    //         return $this->success('修改成功');
    //     } else {
    //         return $this->error('没有该地址');
    //     }
    // }


    /**
     * 编辑地址信息
     * @param int $id 地址id
     * @param string $addr 地址
     * @param string $tel 电话
     * @param string $name 姓名
     * @param string $province 省
     * @param string $city 城市
     * @param string $district 区 
     * @param string $lat 纬度
     * @param string $lng 经度
     * @param string $town 街道乡镇
     * @param string $default 默认地址1
     * @return void
     * @Action
     */
    public function edit_addr($id, $addr, $status = '1', $tel = null, $name = null, $city = null, $lat = null, $lng = null, $default = null, $province = null, $district = null, $town = null)
    {
        $data = $this->GetAddrData($id);
        if ($data) {


            $this->EditAddr($id, $addr, $this->auth->user()->id, $status, $tel, $name, $city, $lat, $lng, $province, $district, $town);



            if ($default)
                $this->UpdateDefaultAddr($this->auth->user()->id, $id);

            return $this->success('修改成功');
        } else {
            return $this->error('没有该地址');
        }
    }

    /**
     * 修改默认地址
     *
     * @param int $uid 用户id
     * @param int $id 地址id
     * @return void
     */
    public function UpdateDefaultAddr($uid, $id)
    {
        Db::name('user')->where('id', '=', $uid)->update(['addr_id' => $id]);
        Db::name('addr')->where('uid', '=', $uid)->update(['default_status' => '0']);
        Db::name('addr')->where('uid', '=', $uid)->where('id', '=', $id)->update(['default_status' => '1']);
    }


    public function 获取表格数据($文件路径)
    {
        $表格实例 = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
        $表格实例->setReadDataOnly(true); //只读模式
        if (!$表格对象 = $表格实例->load($文件路径)) {
            return $this->error(__('Unknown data format'));
        }
        return $表格对象;
    }

    /**
     * 更新地图数据
     *
     * @return void
     * @Action
     */
    public function update_map()
    {
        $文件路径 = 'map/Township_Area_A_20220722.xlsx';
        $数据 = $this->获取表格数据($文件路径);
        // halt($数据);

        $第一个工作表 = $数据->getSheet(0);  //读取文件中的第一个工作表
        $最大的列号 = $第一个工作表->getHighestDataColumn(); //取得最大的列号
        $多少行 = $第一个工作表->getHighestRow(); //取得一共有多少行
        $maxColumnNumber = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($最大的列号);

        var_dump($最大的列号, $多少行, $maxColumnNumber);

        // $content = file_get_contents('map/Township_Area_A_20220722.xlsx');//读取文本内容
        // // echo $content;//打印出内容
        // $this->打印内容并打断运行($content);
        // $arr = explode("\n",$content);//分隔内容为数组
        // // var_dump( $arr);//打印数据

        // $new = [];
        // /**循环数组 */
        // foreach ($arr as $v) {
        //     //halt($v);//打印数据 并且打断循环
        //     $v = $this->转换市($v);
        //     //查询数据库是否有这个地区
        //     $res = Db::name('area')->where('name',$v)->select()->get();
        //     if(!$res){
        //         $new[] = $v;
        //     }

        // }
        // halt($new);

    }

    public function 转换市($地区)
    {

        // if($地区=='北京市市辖区'){
        //     $this->打印内容并打断运行($this->替换市区内容($地区));
        // }
        return str_ireplace('市辖区', '', $地区);
    }

    public function 替换市区内容($地区)
    {
        return str_ireplace('市辖区', '', $地区);
    }

    public function 打印内容并打断运行($内容)
    {
        var_dump($内容);
        exit();
    }
}
